.text
.section .rodata
.align 3
.LC0:
    .string "%s"
.LC1:
    .string "your name is:%s\n"

.text
.align 2
.globl main
.type main, @function
main:
    addi sp, sp, -32
    sd ra, 24(sp)
    sd s0, 16(sp)
    addi s0, sp, 32
    // 从这里可以看出给name分配的空间实际上是-24(s0)，也就是说8(sp)
    // 距离name8个字节就是16(sp)，其实就是原来s0的暂存位置（在倒数第三行会用内存值恢复寄存器）
    // 所以这个地方，假如我们输入的值超过8字节就非常危险，会覆盖16(sp)的值，虽然我们即使这么搞也没有报错，但内存已经被破坏了
    // 假如我们超过16个字节，就会破坏ra的值，即ret的地址都不对了，一定会程序错误
    addi a1, s0, -24
    lui a5, %hi(.LC0)
    addi a0, a5, %lo(.LC0)
    call scanf
    addi a1, s0, -24
    lui a5, %hi(.LC1)
    addi a0, a5, %lo(.LC1)
    call printf
    li a0, 0
    ld ra, 24(sp)
    ld s0, 16(sp)
    addi sp, sp, 32
    jr ra
